import os
import re
from pydub import AudioSegment

# 文件配置
new_ch = r'D:\Documents\work\video\gitee\4\updated_ch.txt'  # 要读取的 updated_ch.txt 文件
processed_folder = r'D:\Documents\work\video\gitee\5\processed_wav_files'  # 已处理的 WAV 文件夹路径
unprocessed_folder = r'D:\Documents\work\video\gitee\5\unprocessed_wav_files'  # 未处理的 WAV 文件夹路径
final_wav = 'ch.wav'  # 最终生成的音频文件路径

# 读取 updated_ch.txt 文件并提取第二个数值（切入时间点）
def extract_audio_time(file_path):
    # 打开文件并读取内容
    with open(file_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    
    # 定义正则表达式模式
    pattern = r'(\d+): \[(\d+), (\d+), .*?\]'
    time_data = []
    
    # 遍历每一行并提取数值
    for line in lines:
        match = re.search(pattern, line)
        if match:
            # 提取行号和第二个数值
            zm_index = int(match.group(1))  # 第一个值是行号
            audio_time = int(match.group(2))  # 第二个数值是音频播放时间点（毫秒）
            time_data.append((zm_index, audio_time))
    
    return time_data

# 收集所有 WAV 文件并按文件名中的 index 排序
def get_sorted_wav_files(processed_folder, unprocessed_folder):
    # 获取已处理和未处理文件夹中的所有 wav 文件
    processed_files = [f for f in os.listdir(processed_folder) if f.endswith('.wav')]
    unprocessed_files = [f for f in os.listdir(unprocessed_folder) if f.endswith('.wav')]
    
    # 合并两个文件夹的文件列表
    all_files = processed_files + unprocessed_files
    
    # 提取文件名中的 index 并按 index 排序
    all_files.sort(key=lambda f: int(f.split('_')[1].split('.')[0]))
    
    return all_files

# 生成完整的音频文件
def create_complete_audio(processed_folder, unprocessed_folder, new_ch, final_wav):
    time_data = extract_audio_time(new_ch)  # 获取切入时间点
    all_wav_files = get_sorted_wav_files(processed_folder, unprocessed_folder)  # 获取所有wav文件
    
    # 初始化一个空的 AudioSegment 对象
    complete_audio = AudioSegment.silent(duration=0)  # 从0ms开始，初始化为空音频
    
    for i in range(len(all_wav_files)):
        # 获取当前文件和切入点
        wav_file = all_wav_files[i]
        file_path = os.path.join(processed_folder, wav_file) if wav_file in os.listdir(processed_folder) else os.path.join(unprocessed_folder, wav_file)
        
        # 读取 WAV 文件
        audio_segment = AudioSegment.from_wav(file_path)
        
        # 获取当前音频的切入时间点（以毫秒为单位）
        current_time = time_data[i][1] if i < len(time_data) else 0
        
        # 根据切入时间点计算静音时长
        silence_duration = current_time - len(complete_audio)
        
        # 如果需要静音，则添加静音
        if silence_duration > 0:
            silence = AudioSegment.silent(duration=silence_duration)
            complete_audio += silence
        
        # 将当前音频文件添加到完整音频
        complete_audio += audio_segment
    
    # 导出最终合成的音频文件
    complete_audio.export(final_wav, format="wav")
    print(f"完整音频已生成：{final_wav}")

# 调用函数生成完整音频
create_complete_audio(processed_folder, unprocessed_folder, new_ch, final_wav)
